/*!
 @header
 @abstract 日期工具类
 @author shadow, 15-06-25 14:06:40
 
 @version 1.0
 */
#import <Foundation/Foundation.h>

/*!
   日期格式化
 */
#define DATE_PATTERN          @"yyyy-MM-dd"

/*!
   时间格式化
 */
#define TIME_24_PATTERN       @"HH:mm:ss"

/*!
   日期 时间 格式化
 */
#define DATE_TIME_24_PATTERN  @"yyyy-MM-dd HH:mm:ss"

/*!
   北京时区
 */
#define TIMEZONE_OF_BEIJING   8 * 3600

/*!
   一天的秒数
 */
#define ONE_DAY               24 * 60 * 60

/*!
   日历单位标识
 */
#define CALENDAR_UNIT_FLAG    NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekOfMonth | NSCalendarUnitWeekdayOrdinal

/*!
 @class
 @abstract 日期的封装
 */
@interface TMTDateUtils : NSObject

/*!
 @method
 @abstract   获取系统当前日期
 @discussion 获取系统当前日期
 
 @return     当前日期
 */
+ (NSDate *)now;

/*!
 @method
 @abstract   获取系统当前日历
 @discussion 获取系统当前日历
 
 @return 当前日历
 */
+ (NSCalendar *)calendar;

/*!
 @method
 @abstract   获得当前时间的毫秒数
 @discussion 获得当前时间的毫秒数
 
 @return     当前时间的毫秒数
 */
+ (long)millis;

/*!
 @method
 @abstract   获取当前月份数字
 @discussion 获取当前月份数字

 @return 当前月份数字
 */
+ (NSInteger)month;

/*!
 @method
 @abstract   获取月份中的第几天
 @discussion 今天是月份中的第几天
 
 @return 月份中的第几天
 */
+ (NSInteger)dayOfMonth;

/*!
 @method
 @abstract   获取一周的第几天
 @discussion 今天是一周中的第几天 1为周日
 
 @return 一周中的第几天
 */
+ (NSInteger)dayOfWeek;

/*!
 @method
 @abstract 获取指定日期在星期
 @discussion
 
 @param date 指定日期
 
 @return 星期
 */
+ (NSInteger)dayOfWeekWithDate:(NSDate *)date;

/*!
 @method
 @abstract   获取一年的第几天
 @discussion 今天是一年中的第几天
 
 @return 一年中的第几天
 */
+ (NSInteger)dayOfYear;

/*!
 @method
 @abstract   本周是这个月的第几周
 @discussion 本周是这个月的第几周
 
 @return 本周是这个月的第几周
 */
+ (NSInteger)weekOfMonth;

/*!
 @method
 @abstract    获得当前月的第一天
 @discussion  获得当前月的第一天
 
 @return      当前月的第一天
 */
+ (NSDate *)firstDayOfMonth;

/*!
 @method
 @abstract    获得当前月的最后一天
 @discussion  获得当前月的最后一天

 @return      当前月的最后一天
 */
+ (NSDate *)lastDayOfMonth;

/*!
 @method
 @abstract   获得当前日期
 @discussion 获得当前日期
 
 @return     当前日期yyyy-MM-dd
 */
+ (NSString *)currentDate;

/*!
 @method
 @abstract   获得当前时间
 @discussion 获得当前时间
 
 @return 当前时间 HH:mm:ss
 */
+ (NSString *)currentTime;

/*!
 @method
 @abstract    获得当前日期时间
 @discussion  日期时间格式yyyy-MM-dd HH:mm:ss
 
 @return      当前日期时间
 */
+ (NSString *)currentDateAndTime;

/*!
 @method
 @abstract    获得当前北京日期时间
 @discussion  日期时间格式yyyy-MM-dd HH:mm:ss
 
 @return      北京日期时间
 */
+ (NSString *)currentDateAndTimeOfPEK;

/*!
 @method
 @abstract     获得当前某个地区的日期时间
 @discussion   日期时间格式yyyy-MM-dd HH:mm:ss
 
 @param zone   时区
 @return       某个地区的日期时间
 */
+ (NSString *)currentDateAndTimeWithTimeZone:(NSTimeZone *)zone;

/*!
 @method
 @abstract      获得当前某个地区的日期时间
 @discussion    日期时间格式 根据pattern
 
 @param zone    时区
 @param pattern 格式
 
 @return 日期时间
 */
+ (NSString *)currentDateAndTimeWithTimeZone:(NSTimeZone *)zone pattern:(NSString *)pattern;

/*!
 @method
 @abstract      格式化日期时间
 @discussion    日期时间格式 根据pattern
 
 @param pattern 日期时间格式
 @param date    需要格式化的日期
 
 @return        日期时间
 */
+ (NSString *)formatDateAndTimeWithPattern:(NSString *)pattern date:(NSDate *)date;

/*!
 @method
 @abstract      格式化某个地区的日期时间
 @discussion    日期时间格式 根据pattern
 
 @param zone    时区
 @param pattern 日期时间格式
 @param date    需要格式化的日期
 
 @return 日期时间
 */
+ (NSString *)formatDateAndTimeWithTimeZone:(NSTimeZone *)zone pattern:(NSString *)pattern date:(NSDate *)date;

/*!
 @method
 @abstract      将字符串日期转换为NSDate
 @discussion    将字符串日期转换为NSDate 格式为 DATE_PATTERN
 
 @param dateStr 待转换的字符串日期
 
 @return        返回 NSDate日期 如果是nil，则转换失败
 */
+ (NSDate *)parseDateWithString:(NSString *)dateStr;

/*!
 @method
 @abstract      将字符串日期转换为NSDate
 @discussion    将字符串日期转换为NSDate

 @param dateStr 待转换的字符串日期
 @param pattern 格式   如果传入为空 默认为DATE_PATTERN
 
 @return        返回 NSDate日期 如果是nil，则转换失败
 */
+ (NSDate *)parseDateWithString:(NSString *)dateStr pattern:(NSString *)pattern;

/*!
 @method
 @abstract      将字符串时间转换为NSDate
 @discussion    将字符串时间转换为NSDate 格式 TIME_24_PATTERN
 
 @param dateStr 待转换的字符串日期
 
 @return        返回 NSDate日期 如果是nil，则转换失败
 */
+ (NSDate *)parseTimeWithString:(NSString *)dateStr;

/*!
 @method
 @abstract      将字符串时间转换为NSDate
 @discussion    将字符串时间转换为NSDate
 
 @param dateStr 待转换的字符串日期
 @param pattern 格式   如果传入为空 默认为TIME_24_PATTERN
 
 @return        返回 NSDate日期 如果是nil，则转换失败
 */
+ (NSDate *)parseTimeWithString:(NSString *)dateStr pattern:(NSString *)pattern;

/*!
 @method
 @abstract      将字符串时间转换为NSDate
 @discussion    将字符串时间转换为NSDate  DATE_TIME_24_PATTERN
 
 @param dateStr 待转换的字符串日期
 
 @return        返回 NSDate日期 如果是nil，则转换失败
 */
+ (NSDate *)parseDateTimeWithString:(NSString *)dateStr;

/*!
 @method
 @abstract      将字符串日期转换为NSDate
 @discussion    将字符串日期转换为NSDate
 
 @param dateStr 待转换的字符串日期
 @param pattern 格式   如果传入为空 默认为DATE_TIME_24_PATTERN
 
 @return        返回 NSDate日期 如果是nil，则转换失败
 */
+ (NSDate *)parseDateTimeWithString:(NSString *)dateStr pattern:(NSString *)pattern;

/*!
 @method
 @abstract   判断源日期是否在目标日期之前
 @discussion 判断源日期是否在目标日期之前

 @param src  源日期
 @param dst  目标日期
 
 @return     YES or NO
 */
+ (BOOL)beforeWithSourceDate:(NSDate *)src destinationDate:(NSDate *)dst;

/*!
 @method
 @abstract   判断源日期是否在目标日期之后
 @discussion 判断源日期是否在目标日期之后
 
 @param src  源日期
 @param dst  目标日期
 
 @return     YES or NO
 */
+ (BOOL)afterWithSourceDate:(NSDate *)src destinationDate:(NSDate *)dst;

/*!
 @method
 @abstract   判断两个日期是否相同
 @discussion 判断两个日期是否相同
 
 @param src  源日期
 @param dst  目标日期
 
 @return     YES or NO
 */
+ (BOOL)equalWtihSourceDate:(NSDate *)src destinationDate:(NSDate *)dst;

/*!
 @method
 @abstract    判断某个日期是否在某个日期范围
 @discussion  判断某个日期是否在某个日期范围

 @param start 日期范围开始
 @param end   日期范围结束
 @param src   需要判断的日期
 
 @return      YES or NO
 */
+ (BOOL)betweenWithStartDate:(NSDate *)start endDate:(NSDate *)end sourceDate:(NSDate *)src;

/*!
 @method
 @abstract    获得两个日期相距天数
 @discussion  获得两个日期相距天数

 @param start 开始日期
 @param end   结束日期
 
 @return    两个日期相距天数
 */
+ (int)daysBetweenWithStartDate:(NSDate *)start endDate:(NSDate *)end;

/*!
 @method
 @abstract     获得基准日期的前后几天的日期
 @discussion   获得基准日期的前后几天的日期
 
 @param date   基准日期
 @param offset 前后几天
 
 @return       基准日期的前后几天的日期
 */
+ (NSDate *)date:(NSDate *)date offset:(int)offset;

/*!
 @method
 @abstract 把一个格式的日期切换成另外一种格式，比如:2015-01-05 变化为:2015-01-05 星期一
 @discussion
 
 @param wildString 日期
 @param fPattern   日期原始格式
 @param tPattern   格式化之后的格式
 
 @return <#return value description#>
 */
+ (NSString *)changeDateString:(NSString *)wildString
                   fromPattern:(NSString *)fPattern
                     toPattern:(NSString *)tPattern;

/*!
 @method
 @abstract 获取制定日期的开始时间的日期（0时0分0秒）
 @discussion
 
 @param wildString 日期
 @param date       制定的日期
 
 @return 获取当前日期的起始时间（0时0分0秒）
 */
+ (NSDate *)startOfDate:(NSDate *)date;

@end
